home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / rexx / mailing.raz < prev    next >
Text File  |  1994-12-16  |  9KB  |  227 lines

  1. /**    $VER: Mailing.raz 1.6 (16.12.94)
  2.  **
  3.  **    Usage  : Mailing.raz <fichier_adresses> <fichier_courrier> <fichier_resultat> <extra_lignes>
  4.  **
  5.  **    Auteur : Patrick Brulé
  6.  **
  7.  **    V1.5 : On ne peut plus l'éxecuter depuis un Shell, seulement depuis
  8.  **             AZur. Les sorties en cas d'erreur montrent maintenant un
  9.  **             message d'explication. Les noms de fichier avec des espaces
  10.  **             ne posent plus de problème.
  11.  **
  12.  **    V1.3 : ajout de l'option NOICON à File2NewWin et File2Win
  13.  **
  14.  **    Ce script est très puissant : il permet de faire différents types
  15.  **    de mailings car c'est le fichier des adresses lui-même qui contient
  16.  **    la description de ses zones.
  17.  **    Il pourra donc être utilisé aussi pour autre chose que du mailing,
  18.  **    par exemple pour remplacer beaucoup d'occurences dans un seul
  19.  **    texte...
  20.  **    Il nécessite qu'une tâche maîtresse AZur soit lancée.
  21.  **
  22.  **    Le script prend 4 paramètres :
  23.  **
  24.  **    - Le nom du fichier contenant les adresses (obligatoire)
  25.  **         Il comporte 2 zones :
  26.  **         - la définition des noms de remplacement (chaque nom commence
  27.  **           en colonne 1)
  28.  **         - la liste des noms et adresses qui commence par la chaîne
  29.  **           "BASE_DE_DONNEES" et fini par la chaîne "FIN_DE_LA_BASE".
  30.  **         Il faut un champ par ligne, et chaque ensemble d'adresse doit
  31.  **         se terminer par une ligne vide.
  32.  **
  33.  **    - Le nom du fichier contenant la lettre type (obligatoire)
  34.  **         Cela peut être aussi un masque d'étiquettes, etc...
  35.  **         Les noms de champs à remplacer doivent être entourés de
  36.  **         "<<" et de ">>". Exemple : <<nom>>
  37.  **
  38.  **    - Le nom du fichier qui contiendra le résultat. S'il n'est pas donné
  39.  **      il s'appellera "RAM:Resultat_Mailing".
  40.  **
  41.  **    - Le nombre de lignes vides à ajouter à chaque fois (optionnel)
  42.  **         Si on ne met rien ou bien 0, un saut de page sera ajouté
  43.  **         entre chaque exemplaire résultant.
  44.  **
  45.  **    Exemple de fichier d'adresses
  46.  **    -----------------------------
  47.  **    .....................début fichier......................
  48.  **    Nom
  49.  **    Prenom
  50.  **    Adresse
  51.  **    Ville
  52.  **    Code
  53.  **    Telephone
  54.  **    +BASE_DE_DONNEES+----------------
  55.  **    Casanova
  56.  **    Robert
  57.  **    Place du mors aux dents
  58.  **    PataugeBoeufs
  59.  **    99999
  60.  **    11.11.11.11
  61.  **
  62.  **    Fricotin
  63.  **    Bibi
  64.  **    6 rue de l'album
  65.  **    Grosses Bouses Les Marais
  66.  **    88888
  67.  **    22.22.22.22
  68.  **
  69.  **    +FIN_DE_LA_BASE+-----------------
  70.  **    ......................fin fichier........................
  71.  **
  72.  **
  73.  **    Exemple de lettre type
  74.  **    ----------------------
  75.  **    .....................début fichier......................
  76.  **    Monsieur <<Nom>>,
  77.  **    J'ai le plaisir de vous apprendre que vous vous prénommez <<Prenom>>
  78.  **    et que vous habitez <<Adresse>>,
  79.  **    dans la ville de "<<Ville>>".
  80.  **    ......................fin fichier........................
  81.  **
  82.  **
  83.  **    Variables du script
  84.  **    -------------------
  85.  **    NumClefs = nombre de mots clefs
  86.  **    Base = Place de la chaine "BASE_DE_DONNEES"
  87.  **    EndFile = Place de la chaine "+FIN_DE_LA_BASE+"
  88.  **    StartBase = 1er élément de la base
  89.  **    EndBase = dernier élément de la base
  90.  **    CompteurBase = indice de la base
  91.  **    Base.x.y => base avec x pour CompteurBase
  92.  **                       et y pour NumClefs
  93.  **    MotClef.NumClefs => base des mots clefs
  94.  **
  95.  **    Pour économiser le temps des affichages successifs, vous pouvez
  96.  **    insérer les commandes "Lock DISPLAY ON" et "Lock DISPLAY OFF"
  97.  **/
  98.  
  99. OPTIONS RESULTS
  100.  
  101. /*---------- On prend les arguments passés au script ----------*/
  102.  
  103. PARSE ARG fichier_adresses fichier_courrier fichier_resultat extra_lignes
  104.  
  105. IF fichier_adresses = "" THEN DO
  106.     GetVar "Mailing_Adresses"; fichier_adresses = RESULT
  107.     IF fichier_adresses = "" THEN fichier_adresses = "Work:"
  108.     ReqFile '"Fichier adresses"' '"'fichier_adresses'"' EXIST
  109.     IF (RC > 0) THEN EXIT
  110.     fichier_adresses = RESULT
  111.     SetVar "Mailing_Adresses" fichier_adresses
  112. END
  113.  
  114. IF fichier_courrier = "" THEN DO
  115.     GetVar "Mailing_Courrier"; fichier_courrier = RESULT
  116.     IF fichier_courrier = "" THEN fichier_courrier = fichier_adresses
  117.     ReqFile '"Fichier courrier"' '"'fichier_courrier'"' EXIST
  118.     IF (RC > 0) THEN EXIT
  119.     fichier_courrier = RESULT
  120.     SetVar "Mailing_Courrier" fichier_courrier
  121. END
  122.  
  123. IF fichier_resultat = "" THEN DO
  124.     GetVar "Mailing_Resultat"; fichier_resultat = RESULT
  125.     IF fichier_resultat = "" THEN fichier_resultat = "RAM:Resultat_Mailing"
  126.     SetVar "Mailing_Resultat" fichier_resultat
  127. END
  128.  
  129. IF extra_lignes = "" THEN extra_lignes = 0
  130.  
  131. /************************************************************************/
  132. /************************ Lecture des adresses **************************/
  133. /************************************************************************/
  134.  
  135. File2NewWin NOICON '"'fichier_adresses'"'
  136. IF (RC > 0) THEN DO; ReqMulti CONVERT TEXT "Chargement impossible du fichier d'adresses :\n   "fichier_adresses; EXIT; END;
  137. portname = RESULT
  138. ADDRESS VALUE portname
  139. SetPrefs TAB2SPACE OFF DOAUTOSAVE OFF DOBACKUP OFF
  140.  
  141.         /*------ rechercher la ligne contenant la chaine "BASE_DE_DONNEES" */
  142. Search RESET SINGLE FULL "BASE_DE_DONNEES"
  143. IF (RC > 0) THEN DO; ReqMulti TEXT 'Début des données introuvable : "BASE_DE_DONNEES"'; EXIT; END;
  144.  
  145. GetPos                      /* Position du curseur => ligne limite */
  146. PARSE VAR RESULT Base . .
  147.  
  148.         /*------ Copier les mots-clefs dans MotClef.NumClefs */
  149. DO NumClefs=1 TO Base-1
  150.         Cursor LINE NumClefs COL 1
  151.         GetWord
  152.         MotClef.NumClefs = '<<'||RESULT||'>>'
  153. END
  154. NumClefs = Base - 1 /* en fait quand on sort de la boucle : NumClefs = Base */
  155.  
  156.         /*------ rechercher la ligne contenant la chaine "+FIN_DE_LA_BASE+" */
  157. Search RESET SINGLE "FIN_DE_LA_BASE"
  158. IF (RC > 0) THEN DO; ReqMulti TEXT 'Fin des données introuvable : "FIN_DE_LA_BASE"'; EXIT; END;
  159.  
  160. GetPos                        /* Position du curseur => ligne limite */
  161. PARSE VAR RESULT EndFile . .
  162.  
  163.         /*------ Initialiser le premier element de la base */
  164. StartBase = Base +1
  165.  
  166.         /*------ Initialiser le dernier element de la base */
  167. EndBase =   EndFile -1
  168.  
  169.         /*------ Tester si la base est correcte*/
  170. c = EndBase - StartBase + 1 /* pour avoir le nombre de ligne entre les deux */
  171. modulo = c // (NumClefs+1)
  172. IF (RC > 0) THEN DO; ReqMulti TEXT 'Le nombre de lignes dans les données est incorrect'; EXIT; END;
  173.  
  174.         /*------ Compter l'indice de la base base.X.Y */
  175. CompteurBase = c/(NumClefs+1)
  176.  
  177. /********************* Copier les data dans base.X.Y */
  178. Lock DISPLAY ON
  179. DO x = 1 TO CompteurBase
  180.         DO y =1 TO NumClefs
  181.             Cursor LINE StartBase + (x-1)*(NumClefs+1) + (y-1) COL 1
  182.             GetLine
  183.             Base.x.y = RESULT
  184.         END
  185. END
  186. Lock DISPLAY OFF
  187.  
  188. /************************************************************************/
  189. /******************** Création du fichier résultat **********************/
  190. /************************************************************************/
  191.  
  192. File2Win CLEAR NOCURS NOICON '"'fichier_courrier'"'
  193. IF (RC > 0) THEN DO; ReqMulti CONVERT TEXT "Chargement impossible du fichier courrier :\n   "fichier_courrier; EXIT; END;
  194.  
  195. /*****************BOUCLE = CompteurBase COMMENCE ICI */
  196.  
  197. DO x = 1 TO CompteurBase
  198.         DO y =1 TO NumClefs
  199.             /*---- remplace chaque occurence dans tout le fichier ----*/
  200.             Replace RESET ALL FULL TEXT '"'MotClef.y'"' WITH '"'Base.x.y'"'
  201.         END
  202.  
  203.         /*---- sauve la fenêtre à la suite dans le fichier ----*/
  204.         Win2File APPEND NAME '"'fichier_resultat'"'
  205.  
  206.         IF extra_lignes = 0 THEN DO
  207.             /*---- insère le caractère de saut de page entre ----*/
  208.             Text2File APPEND NAME '"'fichier_resultat'"' TEXT '0C'x
  209.             END
  210.         ELSE/*---- insère des lignes vides ----*/
  211.             DO y =1 TO extra_lignes
  212.                 Text2File APPEND NAME '"'fichier_resultat'"' CONVERT TEXT "\n"
  213.             END
  214.  
  215.         /*---- recharge le fichier pour l'adresse suivante ----*/
  216.         File2Win CLEAR NOCURS NOICON '"'fichier_courrier'"'
  217. END
  218.  
  219. /********************* FIN DE LA BOUCLE CompteurBase */
  220.  
  221. /************************************************************************/
  222. /********** Chargement du fichier résultat pour vérification ************/
  223. /************************************************************************/
  224.  
  225. SetPrefs TAB2SPACE ON
  226. File2Win CLEAR NOCURS NOICON '"'fichier_resultat'"'
  227.